package br.com.it4.framework.util.resource;

import java.io.Serializable;
import java.text.MessageFormat;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

/**
 * Classe de recursos utilizado nas mensagens do sistema.
 * 
 * @author Mozart Silva (mozart.vsilva@gmail.com)
 * 
 */
public class MessageResource implements Serializable {

    /** Nome do recurso a ser lido. */
    private static final String DEFAULT_BUNDLE = "message";

    /** Locale default. */
    private static final Locale DEFAULT_LOCALE = new Locale("pt", "BR");

    /** ResourceBundle para controlar os recursos. */
    private ResourceBundle resourceBundle;

    /** O classloader. */
    private ClassLoader loader;

    /** O locale. */
    private Locale locale;

    /**
     * Cria um {@link MessageResource}
     * 
     * @param bundle
     *            o nome do recurso a ser lido.
     * @param locale
     *            O locale.
     * @param loader
     *            O class loader o qual irá carregar os recursos.
     */
    public MessageResource(String bundle, Locale locale, ClassLoader loader) {
        super();
        if (bundle == null) {
            bundle = DEFAULT_BUNDLE;
        }

        if (loader == null) {
            loader = getClass().getClassLoader();
        }

        this.loader = loader;

        if (locale == null) {
            locale = DEFAULT_LOCALE;
        }

        this.locale = locale;

        // inicializa o resource bundle.
        this.resourceBundle = ResourceBundle.getBundle(bundle, this.locale, this.loader);
    }

    /**
     * Cria um {@link MessageResource}
     */
    public MessageResource() {
        this(DEFAULT_BUNDLE);
    }

    /**
     * Cria um {@link MessageResource}
     * 
     * @param bundle
     *            o nome do recurso a ser lido.
     */
    public MessageResource(String bundle) {
        this(bundle, DEFAULT_LOCALE, null);
    }

    /**
     * Constroi um {@link MessageResource}
     * 
     * @param loader
     *            O class loader o qual irá carregar os recursos.
     */
    public MessageResource(ClassLoader loader) {
        this(DEFAULT_BUNDLE, DEFAULT_LOCALE, loader);
    }

    /**
     * Retorna uma mensagem a partir da chave passada.
     * 
     * @param key
     *            A chave para recuperar a mensagem.
     * @param params
     *            Parametros passados ao metodo.
     * @return A mensagem recuperada.
     */
    public String get(String key, Object... params) {
        try {
            return MessageFormat.format(this.resourceBundle.getString(key), params);
        } catch (MissingResourceException e) {
            return key;
        }
    }
}